package com.crissy.userService.service.impl;

import cn.hutool.json.JSONUtil;
import com.crissy.userService.common.RedisFinal;
import com.crissy.userService.common.Result;
import com.crissy.userService.entity.UserInfo;
import com.crissy.userService.mapper.UserInfoMapper;
import com.crissy.userService.service.IUserInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author Crissy-月下闲人
 * @since 2023-11-10
 */
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService {

    @Resource
    private UserInfoMapper userInfoMapper;
    @Resource
    private StringRedisTemplate stringRedisTemplate;


    @Override
    public Result<UserInfo> toUpdate(UserInfo userInfo) {
        return null;
    }

    /**
     * 根据用户ID查找用户信息。
     * 先尝试从Redis缓存中获取用户信息，如果缓存中不存在，则从数据库中查询，并将查询到的用户信息存入Redis缓存。
     *
     * @param id 用户的唯一标识符。
     * @return Result<UserInfo> 包含用户信息的Result对象，如果未找到用户信息，则Result的data字段为null。
     */
    @Override
    public Result<UserInfo> toFindById(Long id) {
        // 尝试从Redis获取用户信息
        UserInfo userInfo;
        String userInfoStr = stringRedisTemplate.opsForValue().get(RedisFinal.REDIS_KEY_PREFIX_USER_ID + id);
        if (userInfoStr != null) {
            // 从Redis获取到用户信息，转换为UserInfo对象
            userInfo = JSONUtil.toBean(userInfoStr, UserInfo.class);
        } else {
            // 从数据库查询用户信息
            userInfo = userInfoMapper.selectById(id);
            if (userInfo != null) {
                // 将从数据库中查询到的用户信息存入Redis
                stringRedisTemplate.opsForValue().set(RedisFinal.REDIS_KEY_PREFIX_USER_ID + id, JSONUtil.toJsonStr(userInfo), RedisFinal.REDIS_KEY_USER_ID_TTL, TimeUnit.SECONDS);
            }

        }
        // 返回查询结果
        return Result.success(userInfo);
    }
}
